package telnet

import (
	"fmt"
	"net"
)

// 服务逻辑，传入地址和退出的通道
func server(address string, exitChan chan int) {
	// 根据给定地址进行侦听
	// 使用 net 包的 Listen() 函数进行侦听。这个函数需要提供两个参数，第一个参数为协议类型，
	//		本例需要做的是 TCP 连接，因此填入“tcp”；address 为地址，格式为“主机:端口号”。
	l, err := net.Listen("tcp", address)

	// 如果 listen 错误，打印错误并退出
	if err != nil {
		fmt.Println(err.Error())
		exitChan <- 1
	}

	// 打印地址，表示监听成功
	fmt.Println("listen：" + address)

	// 延迟关闭侦听器
	// 使用 defer，将侦听器的结束延迟调用。
	defer l.Close()

	// 侦听循环
	for {
		// 新连接没有到来时，Accept 是阻塞的
		// 服务器接受了一个连接。在没有连接时，Accept() 函数调用后会一直阻塞。
		//		连接到来时，返回 conn 和错误变量，conn 的类型是 *tcp.Conn。
		conn, err := l.Accept()

		// 发生任务的侦听错误，打印错误并退出服务器
		// 某些情况下，连接接受会发生错误，不影响服务器逻辑，这时重新进行新连接接受。
		if err != nil {
			fmt.Println(err.Error())
			continue
		}

		// 根据连接开启会话，这个过程需要并行执行
		go handleSession(conn, exitChan)
	}
}
